package threadTest;

import java.util.concurrent.CountDownLatch;

/**
 * @Version: sync_wait_notify_version_CountDownLatch
 * @Description:02版本的优化 利用了CountDownLatch这个工具类
 * @LastDate:2020年9月27日上午11:11:20
 */
public class ThreadTest03_CountDownLatch {
	
	public static CountDownLatch latch = new CountDownLatch(1);//因为只有两个线程 设置默认门栓只有一个
	
	public static void main(String[] args) {
		char[] a1 = "123456".toCharArray();
		char[] a2 = "ABCDEF".toCharArray();
		final Object o = new Object();//定义一把对象锁
		
		new Thread(()->{
			
			try {
				latch.await();//latch == 0 ? wait : run
			} catch (InterruptedException e1) {
				e1.printStackTrace();
			}
			
			synchronized (o) {
							
				for (var c : a1) {
					System.out.print(c);
					try {
						o.notify();
						o.wait();
					} catch (Exception e) {
						e.printStackTrace();
					}
				}
				o.notify(); //最后必须唤醒 否则程序不会停止 因为打印结束之后 总有一个线程执行了wait 如果没有人去唤醒 程序就不会结束
			}
		}, "t1").start();
		
		new Thread(()->{
			synchronized (o) {
				
				for (var c : a2) {
					System.out.print(c);
					latch.countDown();//latch - 1
					try {
						o.notify();
						o.wait();
					} catch (Exception e) {
						e.printStackTrace();
					}
				}
				o.notify();
			}
		}, "t2").start();
	}

}
